import axios from 'axios'
import type { AxiosError } from 'axios'
import { ElMessage } from 'element-plus'

/** 后端统一响应结构 */
export interface ApiResp<T = unknown> {
  code: number
  msg: string
  data: T
}

/* ------------------------------------------------------------------ */
/*                       axios 实例 + 拦截器                            */
/* ------------------------------------------------------------------ */

const service = axios.create({
  baseURL: import.meta.env.DEV ? '' : 'http://cloud-test.huichuangpin.com',   // 开发环境走 Vite 代理
  timeout: 15000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

/** 请求拦截器：附带 token */
service.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('token')
    if (token && token !== 'null' && token !== 'undefined') {
      config.headers = config.headers || {}
      config.headers.Authorization = `Bearer ${token}`
    }

    // 打印请求信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('🚀 Request:', {
        url: config.url,
        method: config.method,
        data: config.data,
        params: config.params,
        headers: config.headers,
        token: token ? '***有token***' : '❌无token'
      })

      // 特别为登录请求添加详细调试
      if (config.url === '/api/auth/login') {
        console.log('🔍 登录请求详细信息:')
        console.log('  - URL:', config.url)
        console.log('  - Method:', config.method)
        console.log('  - Headers:', config.headers)
        console.log('  - Data Type:', typeof config.data)
        console.log('  - Data Content:', config.data)
        console.log('  - Data JSON:', typeof config.data === 'string' ? config.data : JSON.stringify(config.data))
      }
    }

    return config
  },
  (error) => {
    console.error('Request Error:', error)
    return Promise.reject(error)
  }
)

/** 响应拦截器：统一处理成功 & 失败 */
service.interceptors.response.use(
  (response) => {
    const { data } = response

    // 打印响应信息（开发环境）
    if (import.meta.env.DEV) {
      console.log('📥 Response:', {
        url: response.config.url,
        status: response.status,
        data: data
      })
    }

    // 检查业务状态码
    if (data.code === 0 || data.code === 200 || data.code === '0' || data.code === '200') {
      return response
    } else {
      // 业务错误
      const errorMsg = data.msg || '请求失败'
      ElMessage.error(errorMsg)
      return Promise.reject(new Error(errorMsg))
    }
  },
  (error: AxiosError<ApiResp>) => {
    console.error('Response Error:', error)

    // 处理不同的HTTP状态码
    if (error.response) {
      const { status, data } = error.response
      let errorMessage = data?.msg || error.message || '请求失败'

      switch (status) {
        case 401:
          errorMessage = '登录已过期，请重新登录'
          // 清除本地存储的认证信息
          localStorage.removeItem('token')
          localStorage.removeItem('userInfo')
          // 跳转到登录页
          window.location.href = '#/login'
          break
        case 403:
          errorMessage = '没有权限访问该资源'
          break
        case 404:
          errorMessage = '请求的资源不存在'
          break
        case 500:
          errorMessage = '服务器内部错误'
          break
        case 502:
          errorMessage = '网关错误'
          break
        case 503:
          errorMessage = '服务暂时不可用'
          break
        default:
          errorMessage = `请求失败 (${status})`
      }

      ElMessage.error(errorMessage)
    } else if (error.request) {
      // 网络错误
      ElMessage.error('网络连接失败，请检查网络设置')
    } else {
      // 其他错误
      ElMessage.error(error.message || '未知错误')
    }

    return Promise.reject(error)
  }
)

export default service
